#ifndef CPP_ACTIVITY_H
#define CPP_ACTIVITY_H

#include <Context.h>
#include <Global.h>
#include <MiniGui.h>
#include <utils/Timer.h>

//类前置声明
class ActivityManager;
class ViewGroup;
class PhoneWindow;
class Bitmap;

//@brief 活动
//@author cvte
//@description 活动，每一个活动组合了一个主窗口和众多子视图，属于上下文对象
class Activity : public Context {
   public:
    friend class ActivityManager;
    friend class Context;
    friend class PowerManager;
    friend class PhoneWindow;
    friend class MainWindow;
    friend class InputMethodManager;

    typedef enum {
        ACT_AMINATION_TYPE_NONE,
        ACT_AMINATION_TYPE_CUSTOM, //自定义
        ACT_AMINATION_TYPE_UPDOWN_BLOCK, //上至下的方块
        ACT_AMINATION_TYPE_RIGHT_LEFT_SCALE, //右到左的缩放效果
        ACT_AMINATION_TYPE_COUNT
    } ACT_AMINATION_TYPE;

    typedef enum {
        ACT_STATUS_NONE,
        ACT_STATUS_CREATE,
        ACT_STATUS_RESUME,
        ACT_STATUS_PAUSE,
        ACT_STATUS_STOP,
        ACT_STATUS_DESTROY,
        ACT_STATUS_SWITCH_ING, //Activity准备跳转时的中间状态
        ACT_STATUS_COUNT
    } ACT_STATUS; //Activity的状态

    class OnEnterAminationListener {
       public:
        //@method 进入动画开始
        virtual void onEnterAminationStart();
        //@method 进入动画结束
        virtual void onEnterAminationEnd();
        //@method 进入动画过程帧回调，返回的Bitmap最终会全屏绘制到屏幕上
        //@param startBitmap为动画开始时的画面，endBitmap为动画结束时的画面（即新Activity的界面）
        virtual Bitmap* onEnterAminationProcess(Bitmap& startBitmap, Bitmap& endBitmap);
    };

    Activity();
    virtual ~Activity();
    //@method 开始进入动画
    void startEnterAnimation();
    //@method 结束进入动画
    void endEnterAnimation();
    //@method 动画帧处理，如果是最后一帧就返回false，否则返回true
    bool processEnterAnimation();
    //@method 保存界面内容到Bitmap
    void contentToBitmap(Bitmap& bitmap);

   protected:
    //@method 创建活动
    virtual void onCreate();
    //@method 恢复活动
    virtual void onResume();
    //@method 暂停活动
    virtual void onPause();
    //@method 停止活动
    virtual void onStop();
    //@method 销毁活动
    virtual void onDestroy();
    //@method 设置状态
    void setStatus(ACT_STATUS status);
    //@method 获取状态
    ACT_STATUS getStatus();

    virtual void onNotify(int notifyId, void* data);
    ViewGroup* getDecorView();

    //@method 设置进入动画
    //@param intervalMs:动画帧间隔时间  type:动画类型  listener:动画监听
    void setEnterAnimation(int intervalMs, ACT_AMINATION_TYPE type, OnEnterAminationListener* listener);
    //@method 是否需要进行进入动画结束后的恢复
    bool shouldResumeAfterEnterAnimation();
    //@method 进行进入动画结束后的恢复
    void resumeAfterEnterAnimation();
    //@method 将父背景模糊并设置为自己的背景
    void blurParentBackground(int radius);
    //@method 状态栏会在activity的view创建后再初始化，状态栏初始化后会调用这里，可以通过重载实现创建在状态栏之上的控件
    virtual void onStatusBarInited();
    //@method 设置在状态栏之上的ViewGroup，不需要另外addView到DecorView
    void setViewGroupOnStatusBar(ViewGroup* viewGroup);
    //@method 获取创建在状态栏之上的ViewGroup
    ViewGroup* getViewGroupOnStatusBar();

    static LRESULT ActivityWinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

   private:
    PhoneWindow* mPhoneWindow;
    ViewGroup* mDecorview;
    ViewGroup* mViewGroupOnStatusBar = nullptr; //不属于状态栏内，但在状态栏之上的ViewGroup
    ACT_STATUS mStatus = ACT_STATUS_NONE; //Activity的状态
    Bitmap* mBackgroundBitmap = nullptr; //动态效果的背景图片
    int mBlurParentBackgroundRadius = 0; //父背景模糊半径
    int mEnterAnimationIntervalMs = 0; //进入动画间隔时长
    ACT_AMINATION_TYPE mEnterAminationType = ACT_AMINATION_TYPE_NONE; //进入动画类型
    OnEnterAminationListener* mEnterAnimationListener = nullptr; //进入动画监听
    Timer mAnimationTimer; //动画定时器
    int mAnimationFrameIndex = 0; //动画帧索引
    Bitmap* mAnimationStartBitmap = nullptr;
    Bitmap* mAnimationEndBitmap = nullptr;
    bool mShouldResumeAfterEnterAnimation = false;
};

#endif /* CPP_ACTIVITY_H */